package main.impl;

import java.awt.Point;

import main.api.GPSState;

//Solo funciona para el goal del cuadrado grande abajo en el medio
public class H3 implements Heuristic{
	Point uCuadrado = null;
	
	public H3(GPSState goalState) {
		int i,j;
		TipoFicha [][] goalTablero=((GPSStateImpl)goalState).getTablero();
		for(i=0; i<goalTablero.length && this.uCuadrado == null; i++)
			for(j=0; j<goalTablero[i].length && this.uCuadrado==null; j++)
				if(goalTablero[i][j]==TipoFicha.cuadradog)
					uCuadrado = new Point(i,j);
	}
	
	@Override
	public Integer computeHeuristic(GPSState state) {
		TipoFicha[][] tablero = ((GPSStateImpl) state).getTablero();
		int aux=0;
		//cuadrado en cuadrado
		if(tablero[uCuadrado.x][uCuadrado.y]==TipoFicha.cuadradog)
			return 0;
		//cuadrado mitad de izquierda
		if(tablero[uCuadrado.x][uCuadrado.y-1]==TipoFicha.cuadradog) {
			if(tablero[uCuadrado.x][uCuadrado.y+1]==TipoFicha.rectv)
				return 2;
			if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
				aux+=1;
			if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
				aux+=1;
			return aux+1;
		}
		//cuadrado mitad de derecha
		if(tablero[uCuadrado.x][uCuadrado.y+1]==TipoFicha.cuadradog) {
			if(tablero[uCuadrado.x][uCuadrado.y]==TipoFicha.rectv)
				return 2;
			if(tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco2)
				aux+=1;
			if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
				aux+=1;
			return aux+1;
		}
		//cuadrado tocando arriba izquierda
		if(tablero[uCuadrado.x-1][uCuadrado.y-1]==TipoFicha.cuadradog) {
			if(tablero[uCuadrado.x+1][uCuadrado.y]==TipoFicha.recth) {
				aux+=1;
				if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			}else {
				if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x][uCuadrado.y+1]==TipoFicha.rectv) {
					aux+=1;
				} else {
					if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
						aux+=1;
					if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
						aux+=1;
				}
			}
			return aux+1;
		}
		//cuadrado tocando arriba
		if(tablero[uCuadrado.x-1][uCuadrado.y]==TipoFicha.cuadradog) {
			if(tablero[uCuadrado.x+1][uCuadrado.y]==TipoFicha.recth) {
				aux+=1;
			} else {
				if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			}
			return aux+1;
		}
		//cuadrado tocando arriba derecha
		if(tablero[uCuadrado.x-1][uCuadrado.y+1]==TipoFicha.cuadradog) {
			if(tablero[uCuadrado.x+1][uCuadrado.y]==TipoFicha.recth) {
				aux+=1;
				if(tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco2)
					aux+=1;
			}else {
				if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x][uCuadrado.y]==TipoFicha.rectv) {
					aux+=1;
				} else {
					if(tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco2)
						aux+=1;
					if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
						aux+=1;
				}
			}
			return aux+1;
		}
		//sin cuadrado cerca
		if(tablero[uCuadrado.x][uCuadrado.y]==TipoFicha.recth) {
			aux+=1;
			if(tablero[uCuadrado.x+1][uCuadrado.y]==TipoFicha.recth) {
				aux+=1;
			} else {
				if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			}
			return aux+1;
		}
		if(tablero[uCuadrado.x][uCuadrado.y]==TipoFicha.rectv) {
			aux+=1;
			if(tablero[uCuadrado.x][uCuadrado.y+1]==TipoFicha.rectv) {
				aux+=1;
			} else {
				if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			}
			return aux+1;
		}
		//ya se que en el borde superior izquierdo del goal hay o blanco o algo que no es rectangulo
		if(tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y]!=TipoFicha.blanco2)
			aux+=1;
		if(tablero[uCuadrado.x][uCuadrado.y+1]==TipoFicha.rectv) {
			aux+=1;
			if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
				aux+=1;
		} else {
			if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
				aux+=1;
			if(tablero[uCuadrado.x+1][uCuadrado.y]==TipoFicha.recth) {
				aux+=1;
				if(tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			} else {
				if(tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y]!=TipoFicha.blanco2)
					aux+=1;
				if(tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco1 && tablero[uCuadrado.x+1][uCuadrado.y+1]!=TipoFicha.blanco2)
					aux+=1;
			}
		}
		return aux+1;
	}

}
